/*
 * Universidad del Valle
 * 
 * Carlos Sagastume, 12113
 * Rodimiro Castaneda, 12122
 */
import java.lang.*;
import java.util.*;


public class Main {
        
        private static Graph<String> grafo;
        
        public static void main(String args []) {
                                                 
            int opc;
            Scanner ingreso =  new Scanner(System.in);
            
            System.out.println("  HOJA DE TRABAJO #09\n");
            
            Main.grafo = new Graph<String>();
            
            do {
                menu();
                opc = (int)obtenerOpcion("Ingrese la opcion a la que desea acceder: ", false);
                System.out.println("");
                
                /* utilizacion de switch para las diferentes opciones */
                switch(opc) {
                    case 1:
                        System.out.print("Ingrese el nombre del Nodo: ");
                        String temporal = ingreso.nextLine();
                        grafo.addNode(temporal);
                        System.out.println("\n");
                        System.out.println("Grafo: ");
                        System.out.println(grafo.toString());
                        break;
                    case 2:
                        System.out.print("Ingrese el Enlace (Nodo1,Nodo2,peso): ");
                        String temporal2 = ingreso.nextLine();
                        System.out.println("\n");
                        String [] temp_array = temporal2.split(",");
                        
                        if (temp_array.length != 3) {
                            System.out.println("\nERROR: SINTAXIS NO VALIDA\n");
                            break;
                        }
                        
                        String A = temp_array[0];
                        String B = temp_array[1];
                        int peso;
                        
                        try {
                            peso = Integer.parseInt(temp_array[2]);
                        } catch(Exception e) {
                            System.out.println("\nERROR: PESO NO VALIDO\n");
                            break;
                        }
                        
                        grafo.addLink(A, B, peso);
                        System.out.println("Grafo: ");
                        System.out.println(grafo.toString());
                        break;
                    case 3:
                        System.out.print("Ingrese el Nodo que desea eliminar: ");
                        String temporal3 = ingreso.nextLine();  
                        
                        if(grafo.getMapa().contains(temporal3)) {
                            int temp_num = grafo.getMapa().indexOf(temporal3);
                            grafo.getMapa().remove(temp_num);
                            grafo.lista_de_extremos.remove(temporal3);
                            
                            for(int i = 0; i < grafo.mapa_de_adyacencia.size(); i++)  {
                                for(int j = 0; j < grafo.lista_de_extremos.size(); j++) {
                                    if (grafo.lista_de_extremos.get(i).get(j).getName().compareToIgnoreCase(temporal3) == 0) {
                                        grafo.lista_de_extremos.get(i).remove(j);
                                    }
                                }
                            }
                        }
                        
                        System.out.println("Grafo: ");
                        System.out.println(grafo.toString());
                        break;
                    case 4:
                        System.out.print("Ingrese el Enlace a elminar (Nodo1,Nodo2): ");
                        String temporal4 = ingreso.nextLine();
                        String [] temp_array2 = temporal4.split(",");
                        
                        if (temp_array2.length != 2) {
                            System.out.println("\nERROR: SINTAXIS NO VALIDA\n");
                            break;
                        } else {
                            if (grafo.mapa_de_adyacencia.contains(temp_array2[0])) {
                                int len1 = grafo.lista_de_extremos.get(grafo.lista_de_extremos.indexOf(temp_array2[0])).size();
                                
                                for(int i = 0; i < grafo.lista_de_extremos.get(grafo.mapa_de_adyacencia.indexOf(temp_array2)).size(); i++) {
                                    if(grafo.lista_de_extremos.get(grafo.mapa_de_adyacencia.indexOf(temp_array2)).get(i).getName().compareTo(temp_array2[1]) == 0) {
                                        grafo.lista_de_extremos.get(grafo.mapa_de_adyacencia.indexOf(temp_array2[0])).remove(i);
                                    }
                                }
                                
                                if (len1 == grafo.lista_de_extremos.get(grafo.mapa_de_adyacencia.indexOf(temp_array2[0])).size()) {
                                    System.out.println("\nERROR: SEGUNDO NODO INEXSITENTE\n");
                                }
                            } else {
                                System.out.println("\nERROR: PRIMER NODO INEXSITENTE\n");
                            }
                        }
                        
                        System.out.println("Grafo: ");
                        System.out.println(grafo.toString());
                        break;
                    case 5:
                        if(grafo.mapa_de_adyacencia.size() == 0) {
                            System.out.print("\nERROR: EL GRAFO ESTÁ VACÍO\n");
                            break;
                        }
                        
                        System.out.println("Ingrese el Nodo de inicio: ");
                        String temporal5 = ingreso.nextLine();
                        
                        if (grafo.mapa_de_adyacencia.contains(temporal5) == false) {
                            System.out.println("\nERROR: EL GRAFO NO CONTIENE EL NODO\n");
                        }
                        
                        String var = grafo.mapa_de_adyacencia.get(grafo.mapa_de_adyacencia.indexOf(temporal5));
                        System.out.println("RUTAS MÁS CORTAS DESDE EL NODO: " + var + "HASTA: ");
                        System.out.println("\n");
                        System.out.println(grafo.Floyd(temporal5));
                        break;
                    case 6:
                        System.out.println("");
                        System.out.println("APLICACION CERRADA");
                        break;                                                                                  // FIN DEL CASE 8
                    default: 
                        System.out.println("\nERROR: OPCION NO VALIDA\n"); 
                        break;
                }
            } while (opc != 6);
        }
        
        public static void menu() {
            System.out.println();
            System.out.println(" ------------- MENU DE OPCIONES ------------- ");
            System.out.println(" 1- Agregar un Nodo.                          ");
            System.out.println(" 2- Agregar un Enlace.                        ");
            System.out.println(" 3- Eliminar un Nodo.                         ");
            System.out.println(" 4- Eliminar un Enlace.                       ");
            System.out.println(" 5- Encontrar ruta más corta.                 ");
            System.out.println(" 6- Salir de la aplicación.                   ");
        }
        
        public static double obtenerOpcion(String mensaje, boolean error){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        System.out.print(mensaje);
        
        /*Exepciones*/
        try {
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception) {
            if (error)
                System.out.println("\nERROR: OPCION NO VALIDA\n"); 
        }
        finally {
            ingreso.nextLine(); // ATRAPA EL "ENTER"
        }
        return num;
    }
    
}